package com.hualan.sfzy.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

//@Component
@Aspect
@Order(2)
public class LogAspect {

    // 前置通知：在目标方法执行之前实现的功能
    @Before("execution(* com.hualan.sfzy.service.content.serviceimpl.*.*(..))")
    public void beforeMethod() {
        System.out.println("AOP日志记录：前置通知......");
    }
    //公共切点表达式
    @Pointcut("execution(* com.hualan.sfzy.service.content.serviceimpl.*.*(..))")
    public void exp() {
    }
    // 后置通知：在目标方法执行之后实现的功能
    @After("exp()")
    public void afterMethod() {
        System.out.println("AOP日志记录：后置通知......");
    }
    // 返回通知：在目标方法有返回值之后实现的功能
    @AfterReturning(value = "exp()", returning = "result")
    public void afterReturnMethod(Object result) {
        System.out.println("AOP日志记录：返回通知......" + result);
    }
    // 异常通知：在目标方法抛出异常之后实现的功能
    @AfterThrowing(value = "exp()", throwing = "ex")
    public void afterThrowMethod(Exception ex) {
        System.out.println("AOP日志记录：异常通知......" + ex);
    }
    /**
     * 环绕通知：综合以上所有的通知
     * 环绕通知必须配置ProceedingJoinPoint参数
     */
    @Around("exp()")
    public void aroundMethod(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("AOP日志记录：环绕通知之前置......");
        try {
//手动执行目标方法
//proceed()就是在执行目标方法，其返回值为目标方法的返回值
            Object resultValue = proceedingJoinPoint.proceed();
            System.out.println("AOP日志记录：环绕通知之返回......" + resultValue);
        } catch (Throwable throwable) {
            System.out.println("AOP日志记录：环绕通知之异常......" + throwable);
            throwable.printStackTrace();
        }
        System.out.println("AOP日志记录：环绕通知之后置......");
    }



}
